package wrapper;

import org.junit.Test;

/**
 * 基本数据类型与包装类的转换
 * > 一方面，在有些场景下，需要使用基本数据类型对应的包装类的对象。
 * > 对于包装类来讲，既然使用的是对象，那么对象是不能进行+-* /等运算的。
 */
public class WrapperTest {

    @Test
    public void testBoxing() {
//        Integer p =new Integer(1);
//        Integer q =new Integer(1);
//        System.out.println(p ==q);//false

        Integer m = Integer.valueOf(1);
        Integer n = Integer.valueOf(1);
        System.out.println(m == n); // true

        /* 享元
        @IntrinsicCandidate
        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }
         */
        // 底层都会调用Integer的valueOf()
        Integer i = 1;
        Integer j = 1;
        System.out.println(i == j);//true

        i = 128;
        j = 128;
        System.out.println(i == j); // false

//        Object o = true ? new Integer(1) : new Double(2.0);
//        System.out.println(o); // 1.0

//        Object o2;
//        if (true)
//            o2 = new Integer(1);
//        else
//            o2 = new Double(2.0);
//        System.out.println(o2); // 1

    }

    @Test
    public void testString() {
        // 基本数据类型、包装类 ---> String类型：调用String的重载的静态方法valueOf(xxx xx);
        // 方式1
        int i = 109;
        String string = String.valueOf(i);
        System.out.println(string);

        // 方式2
        String string1 = i + "";
        System.out.println(string1);

        // String类型 ---> 基本数据类型、包装类：调用包装类的静态方法：parseXxx()
        String s1 = "123";
        Integer integer = Integer.parseInt(s1);
        int i1 = Integer.parseInt(s1);
        System.out.println(integer);
        System.out.println(i1);
    }

    @Test
    public void testTransfer() {
        // 基本数据类型  --> 包装类  装箱
        Integer integer = 10; //auto boxing
        System.out.println(integer);
        integer++;

        System.out.println(integer);
        integer = Integer.parseInt("10");
        System.out.println(integer);

        // 包装类 ---> 基本数据类型  拆箱
        int num = integer; // auto unboxing

    }
}
